Formuła 1: predykcja i strategia

Cele projektu

Celem niniejszego projektu jest analiza danych dotyczących wyścigów Formuły 1 z lat 2018–2024, obejmujących zarówno informacje o warunkach panujących na torze, jak i wskaźniki stylu jazdy kierowców, w tym poziomu agresji. Projekt zakłada ocenę skuteczności strategii zespołów wyścigowych oraz zbadanie wpływu stylu jazdy na ostateczny wynik wyścigu. Dodatkowo, celem jest opracowanie modeli predykcyjnych przewidujących końcową pozycję kierowcy na podstawie wybranych zmiennych, a także klasyfikacja strategii doboru i zużycia opon w kontekście warunków pogodowych oraz ocena ich efektywności.

Zbiór danych

Season Round Circuit Driver Constructor Laps Position TotalPitStops AvgPitStopTime Race.Name Date Time_of_race Location Country Air_Temp_C Track_Temp_C Humidity_. Wind_Speed_KMH Lap.Time.Variation Total.Pit.Stops Tire.Usage.Aggression Fast.Lap.Attempts Position.Changes Driver.Aggression.Score Abbreviation Stint Tire.Compound Stint.Length Pit_Lap Pit_Time
2018 1 Albert Park Grand Prix Circuit Sebastian Vettel Ferrari 58 1 1 21.787 Australian Grand Prix 25-03-2018 05:10:00Z Melbourne Australia 15.78333 22.28333 57 23.8 0.0017235 0.1428571 0.0172414 44.76882 0.0000000 6.755003 VET 1 ULTRASOFT 25 26 21.787
2018 1 Albert Park Grand Prix Circuit Sebastian Vettel Ferrari 58 1 1 21.787 Australian Grand Prix 25-03-2018 05:10:00Z Melbourne Australia 15.78333 22.28333 57 23.8 0.0017235 0.1428571 0.0172414 44.76882 0.0000000 6.755003 VET 2 SOFT 32 NA Final Stint
2018 1 Albert Park Grand Prix Circuit Lewis Hamilton Mercedes 58 2 1 21.821 Australian Grand Prix 25-03-2018 05:10:00Z Melbourne Australia 15.78333 22.28333 57 23.8 0.0017347 0.1428571 0.0172414 44.73482 0.0434783 6.754254 HAM 1 ULTRASOFT 17 19 21.821
2018 1 Albert Park Grand Prix Circuit Lewis Hamilton Mercedes 58 2 1 21.821 Australian Grand Prix 25-03-2018 05:10:00Z Melbourne Australia 15.78333 22.28333 57 23.8 0.0017347 0.1428571 0.0172414 44.73482 0.0434783 6.754254 HAM 2 SOFT 39 NA Final Stint
2018 1 Albert Park Grand Prix Circuit Kimi Räikkönen Ferrari 58 3 1 21.421 Australian Grand Prix 25-03-2018 05:10:00Z Melbourne Australia 15.78333 22.28333 57 23.8 0.0016031 0.1428571 0.0172414 45.13482 0.0869565 6.818562 RAI 1 ULTRASOFT 17 18 21.421
2018 1 Albert Park Grand Prix Circuit Kimi Räikkönen Ferrari 58 3 1 21.421 Australian Grand Prix 25-03-2018 05:10:00Z Melbourne Australia 15.78333 22.28333 57 23.8 0.0016031 0.1428571 0.0172414 45.13482 0.0869565 6.818562 RAI 2 SOFT 40 NA Final Stint
##                  Season                   Round                 Circuit 
##                       0                       0                       0 
##                  Driver             Constructor                    Laps 
##                       0                       0                       0 
##                Position           TotalPitStops          AvgPitStopTime 
##                       0                       0                     185 
##               Race.Name                    Date            Time_of_race 
##                       0                       0                       0 
##                Location                 Country              Air_Temp_C 
##                       0                       0                       0 
##            Track_Temp_C              Humidity_.          Wind_Speed_KMH 
##                       0                       0                       0 
##      Lap.Time.Variation         Total.Pit.Stops   Tire.Usage.Aggression 
##                     185                       0                      66 
##       Fast.Lap.Attempts        Position.Changes Driver.Aggression.Score 
##                     185                       0                     185 
##            Abbreviation                   Stint           Tire.Compound 
##                       0                     109                       0 
##            Stint.Length                 Pit_Lap                Pit_Time 
##                     109                    2810                       0

Opis zmiennych

Kolumna Opis
Season Rok sezonu wyścigowego
Round Numer rundy w sezonie
Circuit Nazwa toru wyścigowego
Driver Imię i nazwisko kierowcy
Constructor Zespół (np. Ferrari, Mercedes)
Laps Liczba ukończonych okrążeń
Position Pozycja końcowa w wyścigu
TotalPitStops Liczba pit stopów kierowcy
AvgPitStopTime Średni czas pit stopów (s)
Race Name Oficjalna nazwa Grand Prix
Date Data wyścigu
Time_of_race Godzina rozpoczęcia wyścigu
Location Miasto wyścigu
Country Kraj, w którym odbywa się wyścig
Air_Temp_C Temperatura powietrza (°C)
Track_Temp_C Temperatura toru (°C)
Humidity_% Wilgotność powietrza (%)
Wind_Speed_KMH Prędkość wiatru (km/h)
Lap Time Variation Zmienność czasów okrążeń
Tire Usage Aggression Wskaźnik agresywnego zużycia opon
Fast Lap Attempts Liczba prób najszybszego okrążenia
Position Changes Zmiany pozycji w trakcie wyścigu
Driver Aggression Score Ogólny wskaźnik agresji kierowcy
Abbreviation Skrót nazwiska kierowcy
Stint Numer stintu (fragment między pit stopami)
Tire Compound Typ mieszanki opon
Stint Length Długość stintu (okrążenia)
Pit_Lap Okrążenie, na którym był pit stop
Pit_Time Czas pit stopu lub ‘Final Stint’

Przygotowanie danych

## 'data.frame':    7265 obs. of  30 variables:
##  $ Season                 : int  2018 2018 2018 2018 2018 2018 2018 2018 2018 2018 ...
##  $ Round                  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Circuit                : chr  "Albert Park Grand Prix Circuit" "Albert Park Grand Prix Circuit" "Albert Park Grand Prix Circuit" "Albert Park Grand Prix Circuit" ...
##  $ Driver                 : chr  "Sebastian Vettel" "Sebastian Vettel" "Lewis Hamilton" "Lewis Hamilton" ...
##  $ Constructor            : chr  "Ferrari" "Ferrari" "Mercedes" "Mercedes" ...
##  $ Laps                   : int  58 58 58 58 58 58 58 58 58 58 ...
##  $ Position               : int  1 1 2 2 3 3 4 4 5 5 ...
##  $ TotalPitStops          : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ AvgPitStopTime         : num  21.8 21.8 21.8 21.8 21.4 ...
##  $ Race.Name              : chr  "Australian Grand Prix" "Australian Grand Prix" "Australian Grand Prix" "Australian Grand Prix" ...
##  $ Date                   : chr  "25-03-2018" "25-03-2018" "25-03-2018" "25-03-2018" ...
##  $ Time_of_race           : chr  "05:10:00Z" "05:10:00Z" "05:10:00Z" "05:10:00Z" ...
##  $ Location               : chr  "Melbourne" "Melbourne" "Melbourne" "Melbourne" ...
##  $ Country                : chr  "Australia" "Australia" "Australia" "Australia" ...
##  $ Air_Temp_C             : num  15.8 15.8 15.8 15.8 15.8 ...
##  $ Track_Temp_C           : num  22.3 22.3 22.3 22.3 22.3 ...
##  $ Humidity_.             : num  57 57 57 57 57 57 57 57 57 57 ...
##  $ Wind_Speed_KMH         : num  23.8 23.8 23.8 23.8 23.8 23.8 23.8 23.8 23.8 23.8 ...
##  $ Lap.Time.Variation     : num  0.00172 0.00172 0.00173 0.00173 0.0016 ...
##  $ Total.Pit.Stops        : num  0.143 0.143 0.143 0.143 0.143 ...
##  $ Tire.Usage.Aggression  : num  0.0172 0.0172 0.0172 0.0172 0.0172 ...
##  $ Fast.Lap.Attempts      : num  44.8 44.8 44.7 44.7 45.1 ...
##  $ Position.Changes       : num  0 0 0.0435 0.0435 0.087 ...
##  $ Driver.Aggression.Score: num  6.76 6.76 6.75 6.75 6.82 ...
##  $ Abbreviation           : chr  "VET" "VET" "HAM" "HAM" ...
##  $ Stint                  : num  1 2 1 2 1 2 1 2 1 2 ...
##  $ Tire.Compound          : chr  "ULTRASOFT" "SOFT" "ULTRASOFT" "SOFT" ...
##  $ Stint.Length           : num  25 32 17 39 17 40 25 32 25 32 ...
##  $ Pit_Lap                : num  26 NA 19 NA 18 NA 26 NA 26 NA ...
##  $ Pit_Time               : chr  "21.787" "Final Stint" "21.821" "Final Stint" ...

EDA

##                   Season                    Round                  Circuit 
##                        0                        0                        0 
##                   Driver              Constructor                     Laps 
##                        0                        0                        0 
##                 Position            TotalPitStops           AvgPitStopTime 
##                        0                        0                      171 
##                Race.Name                     Date                 Location 
##                        0                        0                        0 
##                  Country               Air_Temp_C             Track_Temp_C 
##                        0                        0                        0 
##               Humidity_.           Wind_Speed_KMH       Lap.Time.Variation 
##                        0                        0                      112 
##    Tire.Usage.Aggression        Fast.Lap.Attempts         Position.Changes 
##                       59                      171                        0 
##  Driver.Aggression.Score         Number_of_stints         Avg_stint_length 
##                      112                        0                        0 
##                     TOP3                      DNF            tire_strategy 
##                        0                        0                        0 
## Driver.Fast.Lap.Attempts 
##                      112

Statystyki i wykresy

Powyższa macierz korelacji pokazuje siłę liniowego związku między zmiennnymi przed wstępną ich selekcją oraz imputacją braków danych.

Rozkłady zmiennych

Powyższy histogram i wykres pudełkowy przedstawiają rozkład zmiennej TotalPitStops, która jest sumą pit stopów, jakie miały miejsce podczas danego wyścigu. Jak widać rozkład zmiennej charakteryzuje widoczna asymetria prawostronna, zatem podczas wyścigów przeważnie miejsce miał jeden pit stop. Jak widać na wykresie pudełkowym występuje kilka obserwacji odstających, zmienną charakteryzuje znaczne rozproszenie danych.

Powyższe wykresy pokazują,że zmienną Air_Temp_C charakteryzuje rozkład niemal normalny, obserwacje są skupione wokół średniej, występuje niewielka asymetria oraz obserwacje odstające (zbliżone do 0 bądź powyżej 30 \(^oC\) ).

Powyższe wykresy przedstawiają rozkład zmiennej Humidity_. , która określa poziom wilgotności powietrza na torze. Jak widać charakteryzuje go asymetria lewostronna, zatem wyścigi głównie odbywają się w warunkach o silnej wilgotności powietrza.

Na podstawie powyższych wykresów można stwierdzić,że zmienna Wind_Speed_KMH charakteryzuje się asymetrią prawostronną,co wskazuje na to,że dominują wyścigi, podczas których wiał delikatny wiatr, co jest logiczne, ponieważ wyścigi nie mogą odbywać się podczas silnych wiatrów.

Zmienna Lap.Time.Variation, mierząca zmienność czasów okrążeń kierowców, wykazuje silną prawoskośność z większością wartości skoncentrowanych blisko 0. Typowy kierowca utrzymuje bardzo stabilne tempo wyścigowe, a jedynie sporadycznie występują duże odchylenia, mogące świadczyć o błędach, pit stopach lub incydentach na torze.

Zmiana pozycji kierowców (Position.Changes) wykazuje rozkład niemal równomierny, z wartościami rozłożonymi od 0 do około 0.85. Średnia zmiana pozycji wynosi około 0.4, co sugeruje umiarkowane przesunięcia w klasyfikacji podczas wyścigu.

Zmienna Driver.Aggression.Score charakteryzuje się silną asymetrią prawostronną, występuje wiele obserwacji odstających, jednak większość kumuluje się w okolicy zera, zatem większość kierowców ma podobny styl jazdy.

Zmienna Avg_stint_length obliczona na podstawie Stint.Length charakteryzuje się rozkładem zbliżonym do normalnego, większa część obserwacji skupia się wokół średniej, co sugeruje ,że średnio kierowca jeździ na jednym komplecie opon około 20 okrążeń .Jednak występuje w niej wiele obserwacji odstających , na co wpływ może mieć wyższy miernik Tire.Usage.Agression czy fakt,że kierowca nie ukończył wyścigu.

Normalność rozkładów

\[ H_0: i-ta \ zmienna \ ma \ rozkład \ normalny\\ H_1:i-ta \ zmienna \ ma \ rozkład \ inny \ niż\ normalny\\ \]

zmienna ad_p cvm_p lillie_p
Air_Temp_C 0 0 0
AvgPitStopTime 0 0 0
Avg_stint_length 0 0 0
Driver.Aggression.Score 0 0 0
Driver.Fast.Lap.Attempts 0 0 0
Fast.Lap.Attempts 0 0 0
Humidity_. 0 0 0
Lap.Time.Variation 0 0 0
Laps 0 0 0
Number_of_stints 0 0 0
Position 0 0 0
Position.Changes 0 0 0
TOP3 0 0 0
Tire.Usage.Aggression 0 0 0
TotalPitStops 0 0 0
Track_Temp_C 0 0 0
Wind_Speed_KMH 0 0 0

Wniosek: Na podstawie przeprowadzonych testów zgodności i otrzymanej p-wartości, na poziomie istotności odrzucam \(H_0\) dla każdej zmiennej, zatem żadna z nich nie ma rozkładu normalnego.

Podstawowe statystyki

Variable mean sd var skewness kurtosis
Air_Temp_C 19.60 4.88 23.80 -0.22 0.77
AvgPitStopTime 101.22 264.07 69732.35 4.89 31.34
Avg_stint_length 21.31 8.35 69.76 -0.08 0.39
Driver.Aggression.Score 16.05 36.17 1308.33 5.40 38.43
Driver.Fast.Lap.Attempts 106.20 240.92 58040.82 5.40 38.48
Fast.Lap.Attempts 108.67 243.15 59120.93 5.35 37.68
Humidity_. 67.93 13.40 179.54 -1.18 1.92
Lap.Time.Variation 0.03 0.09 0.01 4.95 32.12
Laps 54.19 17.08 291.79 -1.59 2.73
Number_of_stints 2.83 1.20 1.44 1.37 2.74
Position 10.37 5.76 33.15 0.03 -1.2
Position.Changes 0.41 0.25 0.06 0.03 -1.2
TOP3 0.13 0.34 0.12 2.16 2.68
Tire.Usage.Aggression 0.03 0.04 0.00 13.06 273.17
TotalPitStops 1.71 1.01 1.01 1.08 2.38
Track_Temp_C 25.28 4.99 24.85 -0.16 0.69
Wind_Speed_KMH 11.37 5.89 34.69 1.30 1.88

Feature selection

Badanie zależności

##                    Variable MI_Score
## 1                  Position    0.274
## 2          Position.Changes    0.274
## 3                      Laps    0.095
## 4                      TOP3    0.071
## 5          Avg_stint_length    0.030
## 6     Tire.Usage.Aggression    0.024
## 7            Wind_Speed_KMH    0.018
## 8            AvgPitStopTime    0.009
## 9              Track_Temp_C    0.009
## 10       Lap.Time.Variation    0.009
## 11        Fast.Lap.Attempts    0.009
## 12 Driver.Fast.Lap.Attempts    0.009
## 13               Air_Temp_C    0.007
## 14  Driver.Aggression.Score    0.007
## 15            tire_strategy    0.007
## 16            TotalPitStops    0.004
## 17         Number_of_stints    0.004
## 18               Humidity_.    0.003

Analiza Mutual Information wykazała, że zmiennymi o najwyższej wartości informacyjnej względem zmiennej docelowej DNFPosition oraz Position.Changes, uzyskując MI na poziomie około \(0.3\). Zmienne Laps i TOP3 również posiadają umiarkowaną wartość informacyjną (odpowiednio \(~0.9\) i \(~0.07\)). Natomiast większość pozostałych predyktorów, w szczególności zmienne opisujące warunki pogodowe (Air_Temp_C, Track_Temp_C, Humidity_.), za wyjątkiem Wind_Speed_KMH wykazuje bardzo niską wartość MI (<0.02), co sugeruje ich marginalny wpływ na wynik wyścigu i uzasadnia możliwość ich odrzucenia w dalszym modelowaniu.

Zależności cd.

Zmienna p_value
Driver.Aggression.Score 0.0025
Lap.Time.Variation 0.0032
Avg_stint_length 0.0001
Laps 0.0000
Tire.Usage.Aggression 0.0733
Wind_Speed_KMH 0.0000
AvgPitStopTime 0.0125

Na podstawie przeprowadzonych testów na równość średnich w grupach można stwierdzić,że istnieją istotnie statystycznie różnice między wartościami powyższych zmiennych w grupach wyznaczonych przez zmienną DNF.

Badanie zależności predyktorów

Macierz korelacji ujawnia istotne współzależności między częścią predyktorów, szczególnie Position, Position.Changes, TOP3 i Laps. Zmienne te są częściowo redundantne i mogą prowadzić do współliniowości w modelach liniowych. Z kolei zmienne takie jak Wind_Speed_KMH i Tire.Usage.Aggression wykazują niską korelację z pozostałymi, co może świadczyć o ich niezależnym wkładzie informacyjnym.

Segmentacja warunków pogodowych

## 
##    1    2    3 
##  392  973 1347
## 
##  Pearson's Chi-squared test
## 
## data:  table(formula1$Weather_Cluster, formula1$DNF)
## X-squared = 18.273, df = 2, p-value = 0.0001077
##    
##              0          1
##   1  4.0337571 -4.0337571
##   2  0.1060774 -0.1060774
##   3 -2.9386776  2.9386776

Na podstawie wykresu i przeprowadzonego testu \(\chi^2\) można stwierdzić, że mimo iż zmienne pogodowe były nieinformatywne, to pogoda i DNF nie są niezależne. Na podstawie reszt residualnych, które dla pierwszego klastra w klasie DNF=0 są większe od 2, można stwierdzić ,że w tym klastrze jest więcej ukończonych wyścigów, mniej DNF niż oczekiwano — bezpieczne warunki. Dla drugiego klastra mamy reszty bliskie 0, co oznacza, że w tym klastrze panują umiarkowane warunki, wyścig ukończyło tyle kierowców, ile przeciętnie. Dla trzeciego klastra więcej kierowców nie ukończyło wyścigu niż oczekiwano, zatem w tym klastrze skupione są mniej bezpieczne warunki- bardziej ryzykowne.

## # A tibble: 3 × 5
##   Weather_Cluster avg_air_temp avg_track_temp avg_humidity avg_wind_speed
##   <fct>                  <dbl>          <dbl>        <dbl>          <dbl>
## 1 1                       18.2           23.8         68.7          21.6 
## 2 2                       24.6           30.5         61.3          11.0 
## 3 3                       16.4           22.0         72.5           8.64

Powyższa wizualizacja i tabela podsumowują wnioski z analizy reszt residualnych dla przeprowadzonego testu chi kwadrat.

Klaster 1 (najbezpieczniejszy ):

  • Średnia wilgotność (avg_humidity): bardzo wysoka,
  • Temperatura powietrza i toru: umiarkowana,
  • Wiatr : umiarkowany

Klaster 2:

  • Najwyższa temperatura toru i powietrza, niższa wilgotność,
  • Wiatr: nieco niższy niż w klastrze 1.

Klaster 3:

  • Najniższe temperatury powietrza i toru,
  • Bardzo wysoka wilgotność,
  • Najniższa prędkość wiatru.

Segmentacja stylu jazdy kierowców

## # A tibble: 4 × 8
##   klastry_kierowcy     n Driver.Aggression.Score Lap.Time.Variation
##   <fct>            <int>                   <dbl>              <dbl>
## 1 1                 1038                    6.54            0.00386
## 2 2                  199                   73.8             0.178  
## 3 3                   64                  193.              0.439  
## 4 4                 1240                    6.37            0.00268
## # ℹ 4 more variables: Avg_stint_length <dbl>, Laps <dbl>,
## #   Tire.Usage.Aggression <dbl>, DNF_perc <dbl>

Kierowców udało się pogrupować w cztery wyraźnie różniące się klastry. Najbardziej agresywni i niestabilni (klaster 4) nie charakteryzują się najwyższym ryzykiem DNF. Największe ryzyko nie ukończenia wyścigu mieli kierowcy znajdujący się w klastrach 2 i 3. Większość zawodników należy do bardziej zachowawczych grup, co może przekładać się na większą skuteczność w kończeniu wyścigów. Segmentacja potwierdza, że styl jazdy wpływa na przebieg i wynik rywalizacji jednak różnice w jeździe kierowców, którzy nie ukończyli wyścigów są subtelne.

Modelowanie

Imputacja braków

## [1] "Liczebność klas zmiennej DNF"
## 
##    0    1 
## 1560 1152

Imputacja + SMOTE

Undersampling + imputacja

Train-Global Train-Class0 Train-class1 Test-Global Test-Class0 Test-Class1
Original Dataset (RF) 0.97 0.98 0.96 0.85 0.86 0.85
Original Dataset (LR) 0.83 0.86 0.80 0.83 0.83 0.82
Original Dataset (xgboost) 0.93 0.95 0.91 0.86 0.87 0.86
RF Imputed 0.97 0.97 0.96 0.87 0.88 0.85
LR Imputed 0.85 0.87 0.82 0.83 0.84 0.83
XGBOOST Imputed 0.93 0.94 0.90 0.87 0.88 0.85
RF SMOTE 0.97 0.98 0.96 0.85 0.90 0.80
LR SMOTE 0.85 0.86 0.84 0.83 0.87 0.79
XGBOOST SMOTE 0.92 0.95 0.90 0.85 0.91 0.79
RF Undersampled 0.97 0.98 0.96 0.88 0.89 0.87
LR Undersampled 0.83 0.83 0.83 0.88 0.91 0.86
XGBOOST Undersampled 0.92 0.95 0.90 0.88 0.91 0.86

Na podstawie powyższych wartości accuracy dla każdego ze zbiorów i modeli , decyduje się wybrać XGBOOST Undersampled. Ten wariant osiąga najlepszy ogólny wynik na zbiorze testowym oraz najlepsze wyniki dla obu klas, przy zachowaniu równowagi między klasami i braku przeuczenia (różnice między Train a Test są niewielkie).

Strojenie hiperparametrów

Do strojenia hiperparametrów modelu XGBoost zastosowano optymalizację bayesowską, która opiera się na probabilistycznym modelowaniu funkcji celu i inteligentnym przeszukiwaniu przestrzeni parametrów. W przeciwieństwie do klasycznej siatki (grid search), podejście to szybciej znajduje kombinacje parametrów prowadzące do najlepszych wyników.

## # A tibble: 1 × 7
##    mtry trees tree_depth learn_rate loss_reduction sample_size .config
##   <int> <int>      <int>      <dbl>          <dbl>       <int> <chr>  
## 1     1   283          4     0.0890           1.05           1 Iter20
## # A tibble: 3 × 4
##   .metric     .estimator .estimate .config             
##   <chr>       <chr>          <dbl> <chr>               
## 1 accuracy    binary        0.891  Preprocessor1_Model1
## 2 roc_auc     binary        0.957  Preprocessor1_Model1
## 3 brier_class binary        0.0813 Preprocessor1_Model1

W wyniku optymalizacji bayesowskiej uzyskano skuteczny model XGBoost (\(accuracy = 0.88\), \(AUC = 0.96\)), który łączy wysoką trafność klasyfikacji z dobrą odpornością na przeuczenie. Kluczowe parametry, takie jak niski learn_rate, umiarkowana głębokość drzew (tree_depth) i loss_reduction, zapewniły stabilne i uogólnione wyniki predykcyjne.

Krzywa ROC dla modelu XGBoost pokazuje, że klasyfikator bardzo dobrze rozróżnia przypadki DNF od pozostałych. Krzywa gwałtownie wznosi się ku lewemu górnemu rogowi wykresu, co oznacza wysoką czułość (sensitivity) przy jednocześnie niskim odsetku fałszywie pozytywnych wyników (1 - specificity). Obszar pod krzywą (AUC) wynoszący około 0.94 potwierdza, że model ma bardzo dobrą moc dyskryminacyjną i skutecznie identyfikuje rzadkie przypadki DNF, nawet przy niezbalansowanych danych.

Podsumowanie

Celem projektu była kompleksowa analiza danych z wyścigów Formuły 1 z lat 2018–2024, mająca na celu identyfikację czynników wpływających na nieukończenie wyścigu przez kierowców (zmienna DNF – Did Not Finish). Analiza koncentrowała się na dwóch głównych aspektach: warunkach pogodowych oraz stylu jazdy kierowców.

Na podstawie zmiennych meteorologicznych (temperatura powietrza i toru, wilgotność, prędkość wiatru) dokonano segmentacji warunków pogodowych, wyróżniając trzy klastry o odmiennym profilu ryzyka. Warunki umiarkowane (klaster 2) okazały się względnie neutralne dla DNF, natomiast ekstremalne warunki – zarówno gorące, jak i chłodne i wilgotne – istotnie wpływały na zwiększenie prawdopodobieństwa nieukończenia wyścigu.

Równolegle przeprowadzono segmentację stylów jazdy kierowców na podstawie wskaźników takich jak poziom agresji, zmienność czasu okrążeń czy długość stintów. Wyniki analizy wykazały, że największe ryzyko DNF występowało wśród kierowców z umiarkowaną niestabilnością i umiarkowaną agresją (klastry 2 i 3), podczas gdy najbardziej agresywni kierowcy niekoniecznie należeli do grupy najbardziej ryzykownej.

Przed modelowaniem przeprowadzono testy statystyczne i analizę korelacji, które pozwoliły wyselekcjonować najistotniejsze zmienne wejściowe. Do predykcji zmiennej DNF wybrano model XGBoost, który osiągnął wysoką skuteczność klasyfikacyjną (accuracy = 0.87, AUC = 0.94), zachowując przy tym dobrą równowagę między klasami i odporność na przeuczenie. Proces strojenia hiperparametrów przeprowadzono przy użyciu optymalizacji bayesowskiej, co pozwoliło uzyskać najbardziej efektywną konfigurację modelu.

Ostatecznie stworzony model umożliwia skuteczną klasyfikację kierowców pod względem ryzyka DNF, uwzględniając zarówno ich styl jazdy, jak i warunki pogodowe panujące podczas wyścigu. Wyniki analizy mogą być wykorzystane do wspomagania decyzji strategicznych zespołów F1, w tym w zakresie doboru opon, planowania stintów oraz oceny ryzyka w trudnych warunkach wyścigowych.